\section{Introduction}
\label{sec:intro}

In this work we describe several different implementations of a toy particle simulator that improve upon the naive $O(n^2)$ serial and parallel implementations.  We first present a serial version which makes use of special data structures to achieve an $O(n\log{n})$ execution time and compare the results from this with the naive serial implementation.  We then discuss how we parallelized our $O(n\log{n})$ implementation using a shared memory abstraction.  We also discuss alternative approaches for parallelization.  We present results obtained from running our parallel shared memory version, considering how closely our parallelized version approaches the ideal speedup and analyzing where the execution time of our parallel version is spent.  Lastly, we provide a brief discussion on three different approaches to parallelizing code.
